package practise;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 示例 1:
 *
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 示例 2:
 *
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 示例 3:
 *
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 *      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 *
 */
public class LeetCode_practise2 {
    public static void main(String[] args) {
//        String str = "dadasfavcafdavxczf";
//        String str = " a aaaaa";
//        String str = "abcb";
//        String str = "abcabcbb";
//        String str = "aab";
        String str = "ab";
        LeetCode_practise2 l2 = new LeetCode_practise2();
        int i = l2.lengthOfLongestSubstring(str);
        System.out.println("长度为"+i);
    }

    public int lengthOfLongestSubstring(String s) {
        if(" ".equals(s) || s.length() == 1) {
            return 1;
        }
        Map<String,String> map = new HashMap<>(16);
        List<String> list = new ArrayList<>();
        int index = 0;
        StringBuilder str;
        for (int i = 0; i < s.length(); i++) {
            if (map.get(String.valueOf(s.charAt(i))) == null) {
                map.put(String.valueOf(s.charAt(i)),String.valueOf(s.charAt(i)));
                list.add(String.valueOf(s.charAt(i)));
                System.out.println("当前的list"+list.toString());
                System.out.println("当前的i"+i);
                if (i == s.length() - 1) {
                    System.out.println("进入了上面"+list.toString());
                    str = new StringBuilder("");
                    for (int j = 0; j < list.size(); j++) {
                        str.append(list.get(j));
                        map.remove(list.get(j));
                    }
                    if (map.get("str") != null) {
                        if(map.get("str").length() < list.size()) {
                            map.put("str",str.toString());
                        }
                    } else {
                        map.put("str",str.toString());
                    }
                }
            } else {
                str = new StringBuilder("");
                for (int j = 0; j < list.size(); j++) {
                    str.append(list.get(j));
                    map.remove(list.get(j));
                }
                list = new ArrayList<>();
                if (map.get("str") != null) {
                    if(map.get("str").length() < str.length()) {
                        map.put("str",str.toString());
                    }
                } else {
                    map.put("str",str.toString());
                }
                index++;
                System.out.println(index+"这是index");
                i=index-1;
            }
        }
        System.out.println(map.get("str"));
    return map.get("str")==null?0: map.get("str").length();
    }
}


       /* for (int w = 0; w < s.length(); w++) {
            char c = s.charAt(w);
            String[] split = s.split(String.valueOf(c));
            if (map.get(String.valueOf(c)) != null) {
                continue;
            }
            System.out.println("当前被切分的为"+c);
            map.put(String.valueOf(c),String.valueOf(c));
            if (split.length == 0) {
                map.put("str",String.valueOf(c));
                continue;
            }
            for (int i = 0; i < split.length; i++) {
                boolean flag = false; // false是没有重复，true是有重复
                if (String.valueOf(c).equals("f")) {
                    System.out.println(split[i]);
                }
                for (int j = 0; j < split[i].length(); j++) {
                    if (split[i].indexOf(split[i].charAt(j)) != split[i].lastIndexOf(split[i].charAt(j))) {
                        flag = true;
                    }
                    if (String.valueOf(c).equals("f")) {
                        System.out.println(flag);
                    }
                    if(j == split[i].length() -1 && !flag) {
                        if(map.get("str") == null) {
                                map.put("str",split[i]+c);
                        }
                        if (i != 0 && i!= split.length -1) {
                            System.out.println("进入了1"+split[i]);
                            if (map.get("str").length() <= split[i].length()+1) {
                                map.put("str",split[i]+c);
                            }
                        } else if(i == split.length -1){
                            if (map.get("str").length() <= split[i].length()+1) {
                                System.out.println("进入了2"+split[i]+c);
                                map.put("str",c+split[i]);
                            }
                        }

                    }
                }
            }
        }*/

